package com.dy.design_pattern_study.the_facade_pattern.dome2;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-03-27
 * @Content 外观模式（Facade），为子系统中的一组接口提供一个一致的界面，此模式定义了一个高层接口，这个接口使得这一子系统更加容易使用
 * ---这个跟SpringMVC 有些像
 * Controller 调用接口 Service 通过接口的方法来使用具体的实现
 * <p>
 * 外观模式完美地体现了依赖倒转原则和迪米特法则的思想，所以是非常常用的模式之一
 * <p>
 * 在开发初期 设计层级架构 数据访问层和业务逻辑层、业务逻辑层和 表现层的 层与层之间建立外观 Facade，
 * 这样可以为复杂的子系统提供一个简单的接口，使得耦合大大降低。
 * <p>
 * 其次，在开发阶段，增加外观Facade可以提供一个简单的接口，减少它们之间的依赖。
 * <p>
 * 第三，在维护一个遗留的大型系统时，可能这个系统已经非常难以维护和扩展了，
 * 但因为它包含非常重要的功能，新的需求开发必须要依赖于它 -这时候也用Facade。
 * <p>
 * 你可以为新系统开发一个外观Facade类，
 * 来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口，
 * 让新系统与Facade对象交互，Facade与遗留代码交互所有复杂的工作
 * <p>
 * 简单的说，就是把不同层级区分开来，仅使用接口来调用对应的功能，以达到解耦效果
 * 这个家伙感觉实质就是分层之间的接口调用（SpringMVC的三层分离 -控制器调用服务 是类似的，但不一样，因为mvc是一个整体性的），
 * 就是A类需要调用B类的功能，这时候需要C类来对他们进行解耦，C类可以把 B 类的方法整合起来也可以单独的调用。
 */
public class Client {
    public static void main(String[] args) {
        /*
            该类就像是 Controller
            Facade 就像是 Service
            Controller 调用 Service 的功能
         */
        //调用一个接口 or 类
        Facade facade = new Facade();
        //通过接口使用对应的组合方法
        facade.methodA();
        facade.methodB();
    }
}
